home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 476-500 / disk_499 / diglib / diglib.lzh / source / GSDRW2.for < prev    next >
Text File  |  1991-05-01  |  3KB  |  108 lines

  1.         SUBROUTINE GSDRW2(X0,Y0,IVIS0,X1,Y1,IVIS1)
  2.         IMPLICIT NONE
  3.         REAL*4 X0,Y0,X1,Y1
  4.         INTEGER*2 IVIS0,IVIS1
  5. C
  6. C        CLIP LINE TO CLIPPING BOX.   PASS ON ONLY VISIBLE LINE SEGMENTS TO
  7. C        GSDRW3 TO BE DRAWN IN THE CURRENT LINE TYPE.   THIS SUBROUTINE ALSO
  8. C        WORRIES ABOUT WHETHER THE GRAPHICS DEVICE WILL REQUIRE A "MOVE"
  9. C        BEFORE THE "DRAW" IS DONE.
  10. C
  11.         INCLUDE DIGLIB$KOM:GCCLIP.PRM
  12.         INCLUDE DIGLIB$KOM:GCLTYP.PRM
  13. C
  14.         INTEGER NCLIPS,IST,IFN,IVSC,IVISC,IBIT,I
  15.         REAL*4 DY,XI,YI,Y2,X2,DX
  16. C
  17.         LOGICAL*1 LDID1
  18.     INTEGER*1 IAND,IOR
  19. C
  20. D       WRITE(9,90)X0,Y0,IVIS0
  21. D90    FORMAT('CLIPPING (',F10.3,',',F10.3,')  IVIS=',I2)
  22. D       WRITE(9,91)X1,Y1,IVIS1
  23. D91    FORMAT(' TO (',F10.3,',',F10.3,')  IVIS=',I2)
  24.         IF (IAND(IVIS0,IVIS1) .NE. 0) RETURN
  25.         IF (IVIS0 .EQ. 0) GO TO 10
  26.                 LPOSND = .FALSE.
  27.                 LINILT = .TRUE.
  28. 10      CONTINUE
  29. C
  30. C       CALCULATE THE NUMBER OF CLIPS NECESSARY
  31. C
  32.         NCLIPS = 0
  33.         IF (IVIS0 .NE. 0) NCLIPS = 1
  34.         IF (IVIS1 .NE. 0) NCLIPS = NCLIPS + 1
  35.         IF (NCLIPS .NE. 0) GO TO 100
  36. C
  37. C       LINE TOTALLY VISIBLE, JUST DRAW IT
  38. C
  39.         CALL GSDRW3(X0,Y0,X1,Y1)
  40.         RETURN
  41. C
  42. C       FIND THE INTERSECTION(S) WITH THE CLIPPING BOX EDGES
  43. C
  44. 100     CONTINUE
  45. D       WRITE(9,92)NCLIPS
  46. D92    FORMAT('NCLIPS=',I4)
  47.         LDID1 = .FALSE.
  48.         IST = 1
  49.         DX = X1-X0
  50.         IF (DX .EQ. 0.0) IST = 3
  51.         IFN = 4
  52.         DY = Y1-Y0
  53.         IF (DY .EQ. 0.0) IFN = 2
  54.         IF (IST .GT. IFN) RETURN
  55.         IVISC = IOR(IVIS0,IVIS1)
  56.         IBIT = 2**(IST-1)
  57. D       WRITE(9,93)IST,IFN
  58. D93    FORMAT('IST=',I4,'   IFN=',I4)
  59.         DO 210 I = IST, IFN
  60.         IF (IAND(IVISC,IBIT) .EQ. 0) GO TO 200
  61.         IF (I .GT. 2) GO TO 110
  62.                 XI = XCM0
  63.                 IF (I .EQ. 2) XI = XCM1
  64.                 YI = Y0 + (XI-X0)*DY/DX
  65.                 IF (YI .LT. YCM0 .OR. YI .GT. YCM1) GO TO 200
  66.                 GO TO 120
  67. 110         CONTINUE
  68.                 YI = YCM0
  69.                 IF (I .EQ. 4) YI = YCM1
  70.                 XI = X0 + (YI-Y0)*DX/DY
  71. D               WRITE(9,94)XI,YI
  72. D94        FORMAT('Y INTERSECTION',2F10.3)
  73.                 IF (XI .LT. XCM0 .OR. XI .GT. XCM1) GO TO 200
  74. 120     CONTINUE
  75. C
  76. C       GOT AN INTERSECTION.   IF IT'S THE ONLY ONE, THE DRAW THE LINE.
  77. C
  78.         IF (NCLIPS .GT. 1) GO TO 140
  79.                 IF (IVIS0 .EQ. 0) GO TO 130
  80.                         CALL GSDRW3(XI,YI,X1,Y1)
  81.                         RETURN
  82. 130                CONTINUE
  83.                         CALL GSDRW3(X0,Y0,XI,YI)
  84.                         RETURN
  85. 140         CONTINUE
  86. C
  87. C        TWO CLIPS NECESSARY. IF WE ALREADY HAVE ONE, DRAW THE DOUBLE CLIPPED
  88. C        LINE, ELSE SAVE FIRST CLIP AND WAIT FOR LAST.
  89. C        NOTE, IF DOUBLE CLIPPED, IT DOESN'T MATTER IN WHICH DIRECTION IT
  90. C        IS DRAWN.
  91. C
  92.                 IF (.NOT. LDID1) GO TO 180
  93.                         CALL GSDRW3(X2,Y2,XI,YI)
  94.                         RETURN
  95. 180                 CONTINUE
  96.                         X2 = XI
  97.                         Y2 = YI
  98.                         LDID1 = .TRUE.
  99. 200             CONTINUE
  100.         IBIT = 2*IBIT
  101. 210     CONTINUE
  102. C
  103. C       SEGMENT IS NOT VISIBLE IF WE DROP THRU TO HERE
  104. C
  105.         RETURN
  106.         END
  107.  
  108.